package com.module.ble.repo

import com.module.ble.db.HealthExaManager
import com.module.ble.db.UserCalorieRecordTableQueryHelper
import com.module.ble.db.table.UserCalorie
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch

/**
 *
 * 作者：sosou
 *
 * 版本：1.0
 *
 * 创建日期：2025/09/17
 *
 * 描述：
 *
 * 修订历史：
 *
 */
class UserCalorieRepo private constructor() {

    private val refreshTrigger = MutableStateFlow(0)

    companion object {
        val instance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { UserCalorieRepo() }
    }

    private val dao = HealthExaManager.mUserCalorieDao
    private val scope = CoroutineScope(Dispatchers.IO)

    /**
     * 查找所有数据
     */
    fun findAll(): MutableList<UserCalorie>? {
        return dao?.findAll()
    }

    /**
     * 查找所有未上传数据
     */
    fun findAllNotUp(): MutableList<UserCalorie>? {
        return dao?.findAllNotUp()
    }

    /**
     * 根据传入时间戳查询该时间戳当天的所有数据
     */
    fun findByOneDay(timestamp: Long): List<UserCalorie>? {
        //数据库查找所有数据
        return dao?.findByTimestampTheDay(timestamp)
    }

    fun findByMultiTimeRanges(timeRanges: Array<Long>): List<UserCalorie>? {
        if (timeRanges.isEmpty()) return emptyList()

        val query = UserCalorieRecordTableQueryHelper.createDayStartTimestampsQuery(timeRanges)
        return dao?.findByCustomQuery(query)
    }

    /**
     * 插入数据
     */
    fun add2DB(data: UserCalorie?) {
        data?.let {
            scope.launch {
                dao?.insert(it)
            }
        }
    }

    fun insertDistinct(mList: List<UserCalorie>, batchSize: Int = 500) {
        if (mList.isNullOrEmpty()) return
        scope.launch {
            mList.chunked(batchSize).forEach { batch ->
                dao?.insert(batch)
            }
        }
    }

    fun updateBatch(mList: List<UserCalorie>, batchSize: Int = 500) {
        if (mList.isNullOrEmpty()) return
        scope.launch {
            // 分批处理
            mList.chunked(batchSize).forEach { batch ->
                dao?.update(batch) // 分配更新
            }
        }
    }

    /**
     * 删除数据库中所有数据
     */
    fun deleteAll() {
        scope.launch {
            dao?.deleteAll()
        }
    }

    /**
     * 自动触发 Flow 的更新
     */
    fun refreshData() {
        refreshTrigger.value += 1
    }


    /**
     *
     */
    fun updateAllSysStatToZero() {
        scope.launch {
            dao?.updateAllSysStatToZero()
        }
    }
}